"""
利用Table管理副表，不再单独新建一个表类

"""
from sqlalchemy import create_engine, ForeignKey, Table
from sqlalchemy import Column, Integer, String, Text
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship

engine = create_engine(url='mysql+pymysql://root:123!#Qw@localhost/press?charset=utf8', echo=False)
session = sessionmaker(bind=engine)()
Base = declarative_base()

article_tag = Table(
    # 第一个参数为表名称，第二个参数是 metadata，这俩个是必须的，Base.metadata 是 sqlalchemy.schema.MetaData 对
    # 象,表示所有 Table 对象集合, create_all() 会触发 CREATE TABLE 语句创建所有的表。
    'article_tag', Base.metadata,
    # 对于辅助表，一般存储要关联的俩个表的 id，并设置为外键
    # course_tag 是双主键，双主键的目的就是为了约束避免出现重复的一对主键记录，大部分情况都是应用在这种多对多的中间表中。
    Column('article_id', Integer, ForeignKey('articles.id'), primary_key=True),
    Column('tag_id', Integer, ForeignKey('tags.id'), primary_key=True))


class Article(Base):
    __tablename__ = 'articles'
    id = Column(Integer, primary_key=True)
    title = Column(String(255), nullable=False, index=True)
    content = Column(Text)
    tags = relationship('Tag', secondary=article_tag, backref='articles')  # secondary 指的是中间表，backref 指向自己的这个表

    def __repr__(self):
        return f'书名：{self.title}，内容：{self.content},标签：{self.tags}'


class Tag(Base):
    __tablename__ = 'tags'
    id = Column(Integer, primary_key=True)
    name = Column(String(64), nullable=False, index=True)

    def __repr__(self):
        return f'{self.name}'


Base.metadata.create_all(engine)
# t1 = Tag(name='名著')
# t2 = Tag(name='小说')
t1 = session.query(Tag).filter(Tag.id == 1).first()
t2 = session.query(Tag).filter(Tag.id == 2).first()
a1 = Article(title='三国飞熊22', content='这是著名的小说1')
a4 = Article(title='四海争霸22', content='这是另外的个人小说')
a1.tags = [t1, t2]
a4.tags = [t2]
# session.add_all([t1,t2])
# 查询
# author_one = session.query(Author).filter(Author.id == 1).first()
# print(author_one)
# print(author_one.article)

# 查询
# res = session.query(Tag).filter(Tag.id == 11).first()
# session.delete(res)
# print(res)
session.commit()
